const crypto = require('crypto')

/**
 * UUID
 * @param {*} len
 * @param {*} radix
 * @returns
 */
export function uuid(len, radix) {
  var chars =
    '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
  var uuid = [],
    i
  radix = radix || chars.length

  if (len) {
    // Compact form
    for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)]
  } else {
    // rfc4122, version 4 form
    var r

    // rfc4122 requires these characters
    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
    uuid[14] = '4'

    // Fill in random data. At i==19 set the high bits of clock sequence as
    // per rfc4122, sec. 4.1.5
    for (i = 0; i < 36; i++) {
      if (!uuid[i]) {
        r = 0 | (Math.random() * 16)
        uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r]
      }
    }
  }

  return uuid.join('')
}

/**
 * 生成随机数
 * @param {*} length
 * @returns
 */
export function genID(length) {
  return Number(
    Math.random().toString().substr(3, length) + Date.now()
  ).toString(36)
}

/**
 * 获取Url查询参数
 * @param {*} key
 * @returns
 */
export function getQueryString(key) {
  return (
    decodeURIComponent(
      (new RegExp('[?|&]' + key + '=' + '([^&;]+?)(&|#|;|$)').exec(
        window.location.href
        // eslint-disable-next-line no-sparse-arrays
      ) || [, ''])[1].replace(/\+/g, '%20')
    ) || ''
  )
}

/**
 * 对象Key排序
 * @param {*} jsonObj
 * @returns
 */
export function jsonSort(jsonObj) {
  let arr = []
  for (const key in jsonObj) {
    if (Object.hasOwnProperty.call(jsonObj, key)) {
      arr.push(key)
    }
  }
  arr.sort()
  let str = ''
  for (let i in arr) {
    if (typeof jsonObj[arr[i]] !== 'object') {
      str += arr[i] + jsonObj[arr[i]]
    }
  }
  return str
}

/**
 *  生成签名
 */
export function genSign(params) {
  const cryptoSign = crypto
    .createHash('sha256')
    .update(jsonSort(params))
    .digest('hex')

  return cryptoSign
}
